package controle;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import modelo.Curso;
import modelo.CursoDisciplina;
import modelo.Disciplina;
import service.CursoDisciplinaService;
import service.DisciplinaService;
import util.FabricaDeObjetos;

/**
 *
 * @author Jorge
 */
public class CursoDisciplinaMB extends BaseMB {

    private CursoDisciplinaService cursoDisciplinaService;
    private CursoDisciplina cursoDisciplinaCorrente;
    private List<CursoDisciplina> listaCursoDisciplina;
    private ListDataModel listaDataModel;
    private Curso cursoCorrente;

    private List<String> disciplinasSelecionadas;
    private List<SelectItem> disciplinasDisponiveis;
    
    private DisciplinaService disciplinaService;

    public CursoDisciplinaMB() {
        try {
            cursoDisciplinaService = (CursoDisciplinaService) FabricaDeObjetos.getObjetoUnico(CursoDisciplinaService.class);
            disciplinaService = (DisciplinaService) FabricaDeObjetos.getObjetoUnico(DisciplinaService.class);
        } catch (Exception ex) {
            Logger.getLogger(CursoDisciplinaMB.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    //Método auxiliar
    private String addDisciplina(String origem) {
        CursoMB cursoMB = (CursoMB) getAtributoDaSessao("cursoMB");
        
        if (origem.equals("exibirTodos")) {
            cursoCorrente = (Curso) cursoMB.getListaDataModel().getRowData();
        }
        else {       
            cursoCorrente = cursoMB.getCursoCorrente();
        }
        // O método getDisponiveisPorCurso deve recuperar as matérias que ainda não foram escolhidas pelo curso
        List<Disciplina> disciplinas = disciplinaService.getDisponiveisPorCurso(cursoCorrente);

        disciplinasDisponiveis = new ArrayList<SelectItem>();
        
        for (Disciplina disciplina : disciplinas) {
            disciplinasDisponiveis.add(new SelectItem(disciplina, disciplina.getNome()));
        }

        disciplinasSelecionadas = null;

        return "adicionaDisciplinaNoCurso";
    }
    
    public String addDiscPelaExibirTodos() {
        return addDisciplina("exibirTodos");
    }
    
    public String addDiscPelaBusca() {
        return addDisciplina("busca");
    }
    
    public String salvarInscricao() {

        for (String nomeDisciplina : disciplinasSelecionadas) {
            
            List<Disciplina> listaDisciplina = disciplinaService.getPorNome(nomeDisciplina);

            Disciplina disciplinaEscolhida = null;

            for (Disciplina disciplina : listaDisciplina) {
                if (disciplina.getNome().equals(nomeDisciplina)) {
                    disciplinaEscolhida = disciplina;
                    break;
                }
            }

            CursoDisciplina cursoDisciplina = new CursoDisciplina();
            cursoDisciplina.setCurso(cursoCorrente);
            cursoDisciplina.setDisciplina(disciplinaEscolhida);
            cursoDisciplinaService.inserir(cursoDisciplina);
        }
        
        return "salvarInscricao";    
    }
    
    public String excluirPorCurso() {
        CursoMB cursoMB = (CursoMB) getAtributoDaSessao("cursoMB");
        
        CursoDisciplina cursoDisciplina = (CursoDisciplina) cursoMB.getListaDataModel().getRowData();
        
        cursoDisciplinaService.remover(cursoDisciplina);
        
        return "cursoDisciplinaExcluido";
    }
    
    public String voltar() {
        cursoDisciplinaCorrente = new CursoDisciplina();

        return "voltarExibirTodos";
    }

    public CursoDisciplina getCursoDisciplinaCorrente() {
        return cursoDisciplinaCorrente;
    }

    public void setCursoDisciplinaCorrente(CursoDisciplina cursoDisciplinaCorrente) {
        this.cursoDisciplinaCorrente = cursoDisciplinaCorrente;
    }

    public CursoDisciplinaService getCursoDisciplinaService() {
        return cursoDisciplinaService;
    }

    public void setCursoDisciplinaService(CursoDisciplinaService cursoDisciplinaService) {
        this.cursoDisciplinaService = cursoDisciplinaService;
    }

    public DisciplinaService getDisciplinaService() {
        return disciplinaService;
    }

    public void setDisciplinaService(DisciplinaService disciplinaService) {
        this.disciplinaService = disciplinaService;
    }

    public List<SelectItem> getDisciplinasDisponiveis() {
        return disciplinasDisponiveis;
    }

    public void setDisciplinasDisponiveis(List<SelectItem> disciplinasDisponiveis) {
        this.disciplinasDisponiveis = disciplinasDisponiveis;
    }

    public List<String> getDisciplinasSelecionadas() {
        return disciplinasSelecionadas;
    }

    public void setDisciplinasSelecionadas(List<String> disciplinasSelecionadas) {
        this.disciplinasSelecionadas = disciplinasSelecionadas;
    }

    public List<CursoDisciplina> getListaCursoDisciplina() {
        return listaCursoDisciplina;
    }

    public void setListaCursoDisciplina(List<CursoDisciplina> listaCursoDisciplina) {
        this.listaCursoDisciplina = listaCursoDisciplina;
    }

    public ListDataModel getListaDataModel() {
        return listaDataModel;
    }

    public void setListaDataModel(ListDataModel listaDataModel) {
        this.listaDataModel = listaDataModel;
    }
    
    public Curso getCursoCorrente() {
        return cursoCorrente;
    }

    public void setCursoCorrente(Curso cursoCorrente) {
        this.cursoCorrente = cursoCorrente;
    }
}
